package com.chentf.nio.c3;

import com.chentf.nio.utils.ByteBufferUtil;
import io.netty.buffer.ByteBuf;
import jdk.jfr.events.SocketReadEvent;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;

/**
 * @author chentengfei
 * @desc 非阻塞模式下服务端
 * @date 2022-05-07 16:02:49
 */
public class Server02 {
    public static void main(String[] args) {
        //创建缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(16);
        //获得服务器通道
        try (ServerSocketChannel ssc = ServerSocketChannel.open()){
            //为服务器通道绑定端口
            ssc.bind(new InetSocketAddress(8085));
            //用户存放连接的集合
            List<SocketChannel> channels = new ArrayList<>();
            //循环接收连接
            while (true){
                //设置为非阻塞模式,没有连接时返回null,不会阻塞线程
                ssc.configureBlocking(false);
                //非阻塞，线程还会继续运行，如果没有连接建立，但sc是null
                SocketChannel socketChannel = ssc.accept();
                //通道不为空时才会将连接放入到集合中
                if(socketChannel != null){
                    System.out.println("after connecting...");
                    channels.add(socketChannel);
                }
                //循环遍历结婚中的连接
                for (SocketChannel channel : channels) {
                    //处理通道的数据,设置为非阻塞模式,若通道没有数据,会返回0,不会阻塞线程
                    socketChannel.configureBlocking(false); //非阻塞模式
                    // 非阻塞，线程仍然会继续运行，如果没有读到数据，read 返回 0
                    int read = channel.read(byteBuffer);
                    if(read > 0){
                        byteBuffer.flip(); //切换读写模式
                        ByteBufferUtil.debugRead(byteBuffer); //打印数据
                        byteBuffer.clear();
                        System.out.println("after reading...");

                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
